import time
import re
import json
from typing import Dict, List, Optional, Tuple, Any

def format_message(message_data: Dict[str, Any], is_outgoing: bool = False, is_manual: bool = False) -> str:
    """格式化消息输出"""
    try:
        # 获取消息内容
        content = message_data.get('content', '')
        if not content:
            return ''
            
        # 获取发送时间
        timestamp = message_data.get('time', time.time() * 1000)
        time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp / 1000))
        
        # 确定消息方向
        direction = '【发出】' if is_outgoing else '【收到】'
        if is_manual:
            direction = '【手动发出】'
            
        # 格式化输出
        return f"{time_str} {direction} {content}"
    except Exception as e:
        return f"消息格式化错误: {str(e)}"

def format_system_message(message: str) -> str:
    """格式化系统消息输出"""
    time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    return f"{time_str} 【系统】 {message}" 

def is_fuzzy_keyword(keyword: str) -> bool:
    """判断关键词是否包含占位符，即是否为模糊匹配关键词"""
    return '{*}' in keyword

def detect_fuzzy_keyword(keyword: str) -> bool:
    """检测关键词是否应该标记为模糊匹配
    
    Args:
        keyword: 关键词文本
        
    Returns:
        bool: 如果包含占位符则返回True
    """
    return '{*}' in keyword

def fuzzy_match_keyword(keyword: str, message: str) -> Tuple[bool, Dict[str, str]]:
    """模糊匹配关键词
    
    Args:
        keyword: 包含占位符的关键词模板，如 "今天{*}位能用吗"
        message: 用户发送的消息
        
    Returns:
        Tuple[bool, Dict[str, str]]: (是否匹配, 提取的占位符值字典)
    """
    if not is_fuzzy_keyword(keyword):
        # 不是模糊关键词，使用精确匹配
        return keyword.lower() in message.lower(), {}
    
    # 将占位符替换为正则表达式
    # {*} 匹配任意字符（非贪婪模式）
    pattern = re.escape(keyword).replace(r'\{\*\}', r'(.+?)')
    
    try:
        match = re.search(pattern, message, re.IGNORECASE)
        if match:
            # 构建占位符值字典
            placeholders = {}
            for i, group in enumerate(match.groups(), 1):
                placeholders[f'placeholder_{i}'] = group.strip()
            return True, placeholders
        return False, {}
    except re.error:
        # 正则表达式错误，回退到普通匹配
        return keyword.lower() in message.lower(), {}

def format_fuzzy_reply(reply: str, placeholders: Dict[str, str], send_user_name: str = '', 
                      send_user_id: str = '', send_message: str = '') -> str:
    """格式化模糊匹配的回复内容
    
    Args:
        reply: 回复模板
        placeholders: 从关键词中提取的占位符值
        send_user_name: 发送者昵称
        send_user_id: 发送者ID
        send_message: 原始消息
        
    Returns:
        str: 格式化后的回复内容
    """
    try:
        # 构建格式化参数字典
        format_params = {
            'send_user_name': send_user_name,
            'send_user_id': send_user_id,
            'send_message': send_message,
            **placeholders  # 添加占位符值
        }
        
        # 支持在回复中使用 {placeholder_1}, {placeholder_2} 等
        formatted_reply = reply.format(**format_params)
        return formatted_reply
    except Exception as e:
        # 格式化失败，返回原始回复
        return reply

def get_keyword_help_text() -> str:
    """获取关键词帮助文本"""
    return """
关键词支持两种模式：

1. 精确匹配：直接输入关键词，如 "包邮吗"
2. 模糊匹配：使用 {*} 作为占位符，如 "今天{*}位能用吗"

模糊匹配示例：
- 关键词："今天{*}位能用吗" 可以匹配 "今天5位能用吗"、"今天10位能用吗" 等
- 关键词："{*}多少钱" 可以匹配 "这个多少钱"、"那款多少钱" 等

在回复中可以使用以下变量：
- {send_user_name}: 发送者昵称
- {send_user_id}: 发送者ID  
- {send_message}: 原始消息内容
- {placeholder_1}: 第一个占位符匹配的内容
- {placeholder_2}: 第二个占位符匹配的内容（如果有多个占位符）

回复示例：
"亲爱的{send_user_name}，关于{placeholder_1}的问题，我来为您解答..."
""" 